package com.unitd.modules.sys.service.impl;

import com.unitd.comm.constant.ToolConstant;
import com.unitd.frame.comm.utils.DateUtils;
import com.unitd.frame.comm.utils.ListUtils;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.mybatis.core.dao.IBaseDao;
import com.unitd.frame.mybatis.core.service.impl.BaseServiceImpl;
import com.unitd.modules.sys.dao.ISysMenuDao;
import com.unitd.modules.sys.dao.ISysRoleDao;
import com.unitd.modules.sys.dao.ISysRoleMenuDao;
import com.unitd.modules.sys.entity.SysMenu;
import com.unitd.modules.sys.entity.SysRole;
import com.unitd.modules.sys.service.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @desc 角色表业务逻辑控制接口实现类
 * @filename SysRoleServiceImpl.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-04-08
 */
@Service("sysRoleService")
public class SysRoleServiceImpl extends BaseServiceImpl<SysRole, String> implements ISysRoleService {

	@Autowired
	private ISysRoleDao sysRoleDao;
	@Autowired
	private ISysMenuDao sysMenuDao;
	@Autowired
	private ISysRoleMenuDao sysRoleMenuDao;

	/**
	 * @return GenericDao实现类
	 * @desc 定义成抽象方法, 由子类实现, 完成dao的注入
	 */
	@Override
	public IBaseDao<SysRole, String> getDao() {
		return sysRoleDao;
	}

	/**
	 * @desc 插入之前执行方法, 需要手工调用
	 * @param sysRole 数据保存对象
	 * @param userId 操作人
	 */
	private void preInsert(SysRole sysRole, String userId) {
		sysRole.setId(sysRoleDao.getPrePrimaryKey()); 						// 生成ID
		sysRole.setCreateBy(userId);
		sysRole.setCreateDate(DateUtils.formatDate(new Date(), DateUtils.TIMESTAMP_PATTERN));
	}

	/**
	 * @desc 更新之前执行方法，需要手动调用
	 * @param sysRole 数据保存对象
	 * @param userId 操作人
	 */
	private void preUpdate(SysRole sysRole, String userId){
		sysRole.setUpdateBy(userId);
		sysRole.setUpdateDate(DateUtils.formatDate(new Date(), DateUtils.TIMESTAMP_PATTERN));
	}

	/**
	 * @desc 根据主键ID获取对应的详情信息
	 * @param id 主键ID
	 * @return 机构详情
	 */
	@Override
	public SysRole findBy(String id) {
		SysRole sysRole = new SysRole("2");
		if (!StringUtils.isZero(id)) {
			sysRole = sysRoleDao.findBy(id);
		}
		return sysRole;
	}

	/**
	 * @desc 根据条件查询获取系统角色信息
	 * @return List
	 */
	@Override
	public List<SysRole> findAllData() {
		return sysRoleDao.findAllData();
	}

	/**
	 * @desc 根据条件查询获取系统角色信息
	 * @param sysRole  查询条件
	 * @return List
	 */
	@Override
	public List<SysRole> findListBy(SysRole sysRole) {
		return sysRoleDao.findListBy(sysRole);
	}

	/**
	 * @desc 根据父角色，查询子角色
	 * @param parentId 父角色ID
	 */
	@Override
	public List<SysRole> findListByParentId(String parentId) {
		return sysRoleDao.findListByParentId(parentId);
	}

	/**
	 * @desc 根据用户ID获取该用户对应的角色列表
	 * @param userId 用户ID
	 * @return List
	 */
	@Override
	public List<SysRole> findRoleListByUserId(String userId) {
		return sysRoleDao.findRoleListByUserId(userId);
	}

	/**
	 * @desc 根据用户ID获取该用户对应的角色角色名称,多个角色用,分割
	 * @param userId 用户ID
	 * @return List
	 */
	@Override
	public String findRoleNameByUserId(String userId) {
		StringBuffer sb = new StringBuffer();
		List<SysRole> sysRoles = sysRoleDao.findRoleListByUserId(userId);

		if(!ListUtils.isNull(sysRoles)) {
			for(SysRole sysRole : sysRoles) {
				sb.append(sysRole.getName()).append(",");
			}
			String roleNames = sb.toString();
			return roleNames.substring(0, 	roleNames.lastIndexOf(","));
		}
		return "游客";
	}

	/**
	 * @desc 根据角色ID获取该角色对应的所有权限菜单信息
	 * @param roleId 角色主键
	 * @return List
	 */
	@Override
	public List<Map<String, Object>> getRoleRightTreeByRoleId (String roleId) {
		// 将菜单的列表信息转换成树结构json
		List<Map<String, Object>> rightList = new ArrayList<>();
		// 获取所有的菜单信息以及指定角色下的所有菜单ID
		List<SysMenu> sysMenus = sysMenuDao.findAllData();
		List<String> roleRightList = sysRoleMenuDao.findMenuIdsByRoleId(roleId);

		for (SysMenu sysMenu : sysMenus) {
			Map<String, Object> map = new HashMap<>();
			map.put("id", sysMenu.getId().toString());
			map.put("pId", sysMenu.getParentId());
			map.put("name", sysMenu.getName());

			// 默认展开树
			map.put("open", "true");
			// 如果角色已有该权限，则默认选中
			if (roleRightList.contains(sysMenu.getId())) {
				map.put("checked", "true");
			}
			rightList.add(map);
		}
		return rightList;
	}

	/**
	 * @desc 处理数据保存/更新
	 * @param param 前端传送的需要处理的数据
	 * @return 数据保存/更新结果
	 */
	@Override
	@Transactional(rollbackFor={RuntimeException.class, Exception.class, Throwable.class})
	public Integer doEdit(Map<String, Object> param) {
		Integer result = 0;
		SysRole sysRole = (SysRole) param.get(SysRole.class.getName());
		String userId = (String) param.get(ToolConstant.USER_TOKEN_ID);

		if (sysRole != null) {
			if (!StringUtils.isZero(sysRole.getId())) {
				preUpdate(sysRole, userId);
				result = sysRoleDao.updateByPrimaryKeySelective(sysRole);
			} else {
				preInsert(sysRole, userId);
				result = sysRoleDao.insertSelective(sysRole);
			}
		}
		return result;
	}

	/**
	 * @desc 根据ID串删除机构(同时还需要删除对应的角色-机构关联信息)
	 * @param ids 需要删除的详情信息ID串,多个ID之间用,分割
	 * @return 删除记录条数
	 */
	@Override
	@Transactional(rollbackFor={RuntimeException.class, Exception.class, Throwable.class})
	public Integer doDelete(String ids) {
		Integer result = 0;

		List<String> idList = StringUtils.toList(ids, ",");
		SysRole param = new SysRole(); 								// 删除方法的参数对象
		for(String id : idList) {
			param.setId(id); 										// 设置参数

			// 逻辑删除
			result += sysRoleDao.deleteByDelFlag(param);
		}
		return result;
	}

}